<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-cn">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Android项目自动生成build.xml，用Ant打包 - 青山隐隐，绿水迢迢 - 博客园</title>
<link type="text/css" rel="stylesheet" href="/bundles/blog-common.css?v=gdNkSiQMyBMkpTeO1ex9qW-60UbMszQItnCUpBAT3LQ1"/>
<link id="MainCss" type="text/css" rel="stylesheet" href="http://common.cnblogs.com/Skins/sea/style.css?id=20140110"/>
<link title="RSS" type="application/rss+xml" rel="alternate" href="http://www.cnblogs.com/liuyue0802/rss"/>
<link title="RSD" type="application/rsd+xml" rel="EditURI" href="http://www.cnblogs.com/liuyue0802/rsd.xml"/>
<link type="application/wlwmanifest+xml" rel="wlwmanifest" href="http://www.cnblogs.com/liuyue0802/wlwmanifest.xml"/>
<script src="http://common.cnblogs.com/script/jquery.js" type="text/javascript"></script>  
<script type="text/javascript">var currentBlogApp = 'liuyue0802', cb_enable_mathjax=false;</script>
<script src="/bundles/blog-common.js?v=eXlhU-bqKkymbSfkt4kaWm3xDU3EegYz0YD5G5sO6gk1" type="text/javascript"></script>
</head>
<body>
<a name="top"></a>

<!--done-->
<div id="header">
	
<!--done-->
<div class="header">
	<div class="headerText">
		<a id="Header1_HeaderTitle" class="headermaintitle" href="http://www.cnblogs.com/liuyue0802/">青山隐隐，绿水迢迢</a><br>
		
	</div>
</div>

</div>

<div id="mytopmenu" >
	
		<div id="mylinks">
<!--done-->
<a id="MyLinks1_HomeLink" class="menu" href="http://www.cnblogs.com/">博客园</a> &nbsp;
<a id="MyLinks1_MyHomeLink" class="menu" href="http://www.cnblogs.com/liuyue0802/">首页</a> &nbsp;
<a href="http://q.cnblogs.com" class="menu">博问</a> &nbsp;
<a href="http://home.cnblogs.com/ing/" class="menu">闪存</a> &nbsp;
<a id="MyLinks1_NewPostLink" class="menu" rel="nofollow" href="http://i.cnblogs.com/EditPosts.aspx?opt=1">新随笔</a> &nbsp;
<a id="MyLinks1_ContactLink" class="menu" rel="nofollow" href="http://space.cnblogs.com/msg/send/%e9%9d%92%e5%b1%b1%e9%9a%90%e9%9a%90%ef%bc%8c%e7%bb%bf%e6%b0%b4%e8%bf%a2%e8%bf%a2">联系</a> &nbsp;
<a id="MyLinks1_Syndication" class="menu" href="http://www.cnblogs.com/liuyue0802/rss">订阅</a><a id="MyLinks1_XMLLink" href="http://www.cnblogs.com/liuyue0802/rss"><img src="http://www.cnblogs.com/images/xml.gif" alt="订阅" /></a>&nbsp;
<a id="MyLinks1_Admin" class="menu" rel="nofollow" href="http://i.cnblogs.com/">管理</a>
</div>
		<DIV id="mystats">
<!--done-->
随笔-8&nbsp;
评论-0&nbsp;
文章-0&nbsp;
trackbacks-0
</DIV>
	
</div>
<div id="centercontent" >
	

<div class = "post">
	<h1 class = "postTitle"><a id="cb_post_title_url" class="postTitle2" href="http://www.cnblogs.com/liuyue0802/p/3349931.html">Android项目自动生成build.xml，用Ant打包</a></h1>
	<div id="cnblogs_post_body"><p><strong><span>Android本身是支持ant打包项目的，并且SDK中自带一个build.xml文件。</span><br /><span>通过该文件，可以对文件进行编译、打包、安装等。</span></strong></p>
<p><strong><span>并且支持多种方式打包，如debug或者release。</span></strong></p>
<p><strong><span>在使用Ant构建打包之前</span></strong></p>
<p><strong>一、生成<span>build.xml</span></strong></p>
<p>Eclipse<span>中使用</span><span>Ant</span><span>为</span><span>Android</span><span>打包并且签名。</span></p>
<p>SDK<span>自带文件&nbsp;在</span><span>&lt;sdk&gt;tools/ant</span><span>目录下这</span><span>3</span><span>个文件。</span></p>
<p><span><img src="http://images.cnitblog.com/blog/398602/201310/03092719-f5b5477abd404d71ae007bb3e8281235.jpg" alt="" /></span></p>
<p>其中build.xml<span>和</span><span>uibuild.xml</span><span>中定义了大量基础构建方法和打包策略。我们只需要建立我们自己的</span><span>build.xml</span><span>并且存放在项目的根目录下，然后引用一下</span><span>&lt;sdk&gt;tools/ant/build.xml</span><span>即可。当然也可以拷贝它然后直接操作。</span></p>
<p>那么如何。以项目<span>AntForAndroid</span><span>为例。生成一个针对该项目的</span><span>build.xml</span><span>呢？</span></p>
<p>这里需要一个工具。就是<span>SDK</span><span>自带的</span><span>android.bat&nbsp;.</span><span>所在目录</span><span>&lt;sdk&gt;tools/android.bat。</span></p>
<p><span><span>通过执行如下命令即可在指定的项目目录下生成build.xml文件。</span></span></p>
<p><span><span>&lt;sdk&gt;/tools/android update project -p &lt;project&gt; -t &lt;target&gt;</span></span></p>
<p><span><span><span>其中：</span><br /><span>sdk为sdk的安装目录，其下的tools/android是我们要使用的命令。</span><br /><span>project为项目目录。</span><br /><span>target为项目所使用的android的target id，也就是项目对应的android的版本。</span></span></span></p>
<p><span><span><span>可以将sdk的tools目录添加到环境变量 ~/.bashrc 文件中，重启后生效，以后可以直接使用命令了。<br />可以通过执行以下命令查看当前sdk中所包含的target以及相应id：<br />android list targets。</span></span></span></p>
<p>执行上述命令将新生成的3<span>个文件&nbsp;</span><span>build.xml,local.properties,proguard-project.txt.</span></p>
<p><span><img src="http://images.cnitblog.com/blog/398602/201310/03093055-52e02622bb8a47a7887948666a299bb1.jpg" alt="" /></span></p>
<p><span><span>　　其中，build.xml文件是进行ant build的主要文件，它引用了其它文件。这些被引用的文件有local.properties，ant.properties两个属性文件，以及<span>在build.xml中的最后，引用了sdk目录下的tools/ant/build.xml文件。</span></span></span></p>
<p><span><span>　　local.properties文件中定义了sdk.dir属性，也就是当前使用的sdk的目录。</span></span></p>
<p>　　ant.properties可根据构建需要进行相关配置。</p>
<p>　　项目下的build.xml默认执行的target是help，运行后可以看到相关的帮助信息。如果需要的话，我们可将其修改为debug或者release。</p>
<p>　　通过查看相关的帮助信息<span>，可以看到其它可用的target。然后运行ant时，可指定target。例如，ant debug, ant help, ant relaese等等。</span></p>
<p><strong>二、配置<span>ant.properties&nbsp;</span></strong></p>
<p>　　ant.properties文件是不会自动生成的，需在项目根目录下新建一个ant.properties文件<span>。</span></p>
<p><span>&nbsp; &nbsp; &nbsp; 然后根据构建的实际需要进行相关配置。<span>在ant.properties文件中，可以定义自己的一些属性，或者重定义一些属性。</span></span></p>
<p><span><span>1、设定私钥库</span></span></p>
<p><span><span><span>　　ant构建时，如果是debug版的话，默认会使用debug方式签名。</span><br /><span>　　如果是release版的话，需指定相应的keystore以及私钥。否则，最后只能生成一个没有签名的apk文件。</span><br /></span></span></p>
<p><span><span><span>　　设定私钥库的方法如下：</span></span></span></p>
<p>&nbsp;</p>
<p><span><span><span>　　在ant.properties文件中，添加如下内容：</span><br /><span>　　　　key.store=&lt;keystore&gt;</span><br /><span>　　　　key.alias=&lt;key&gt;</span><br /><span>　　　　key.store.password=&lt;keystore pwd&gt;</span><br /><span>　　　　key.alias.password=&lt;key pwd&gt;</span></span></span></p>
<p><span>　　　　其中：</span><br /><span>　　　　　　keystore为私钥库文件。</span><br /><span>　　　　　　key为签名需要使用的私钥。</span><br /><span>　　　　　　key.store.password为私钥库的密码。</span><br /><span>　　　　　　key.alias.password为私钥的密码。</span></p>
<p><span>2、<span>如果项目引用了第三方库的话，只需要在项目根目录创建libs文件夹并将其放入即可。</span></span></p>
<p><span><span><span>　　如果是jar库，直接放到libs目录下；</span></span></span></p>
<p><span><span><span>　　如果是so库，需要放到libs的名为armeabi的子目录下。</span></span></span></p>
<p><span><span><span>　　也可以通过设定相应的属性来指定第三方库的位置，其默认都是libs文件夹。</span><br /><span>　　jar.libs.dir为jar类型库所在的目录。</span><br /><span>　　native.libs.absolute.dir为so类型库所在的目录，即armeabi的父目录。</span></span></span></p>
<p><span>3、如果项目包含了jni代码，希望在打包时自动重新编译so库，可以修改build.xml文件。</span><br /><span>　　修改方法为，在引用sdk的build.xml文件之前添加如下target：</span><br /><span>　　&lt;target name="-pre-build" depends="-ndk-build"&gt;</span><br /><span>　　&lt;/target&gt;</span><br /><span>　　&lt;target name="-ndk-build"&gt;</span><br /><span>&nbsp;&nbsp;&nbsp; 　　&lt;exec executable="ndk-build" failonerror="true"&gt;</span><br /><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　&lt;arg value="clean" /&gt;</span><br /><span>&nbsp;&nbsp;&nbsp; 　　&lt;/exec&gt;</span><br /><span>&nbsp;&nbsp;&nbsp; 　　&lt;exec executable="ndk-build" failonerror="true" /&gt;</span><br /><span>　　&lt;/target&gt;</span></p>
<p><span><span>　　ndk-build为ndk提供的命令，需要将ndk安装目录添加到环境变量中，添加方法同sdk/tools。</span><br /><span>生成的so默认会放到libs/armeabi目录下。</span></span></p>
<p>&nbsp;<strong>三、实现自动打包签名<span>apk</span></strong></p>
<p><strong><span>　　有两种方式可实现。</span></strong></p>
<p><strong><span>1、一种方式在elispe中执行ant.</span></strong></p>
<p>右键点击项目中的<span>build.xml-&gt;run&nbsp;as...&nbsp;</span><span>先查看下有多少种任务，当然这些任务都是来自</span><span>&lt;sdk&gt;\tools\ant\build.xml,</span><span>项目里的只是引用了它</span></p>
<p>&nbsp;</p>
<p><img src="http://img.my.csdn.net/uploads/201301/10/1357804123_4946.png" alt="" width="607" height="428" /></p>
<p>&nbsp;</p>
<p>　　窗口打开</p>
<p><img src="http://img.my.csdn.net/uploads/201301/10/1357804250_3314.png" alt="" width="647" height="317" /></p>
<p>默认的选择在help<span>上。打签名包的时候执行</span><span>release</span><span>这个任务即可。</span></p>
<p>按照以上的步骤配置好之后就能生成签名<span>apk</span><span>。</span></p>
<p>最后在项目跟目录<span>\bin</span><span>下生成</span><span>apk</span><span>包。</span></p>
<p><strong>2、第二种方式通过命令行执行。</strong></p>
<p>生成debug版本：ant debug</p>
<p>生成release版本：ant release</p>
<p>&nbsp;</p>
<p>大家可以通过学习&lt;sdk&gt;\tools\ant\build.xml来理解ant的基本奥妙。</p>
<p>Ant<span>是非常强大的。可以实现以下功能。</span></p>
<p>例如：</p>
<p>1.在生成<span>apk</span><span>的文件名里加上日期。</span></p>
<p>2.把<span>apk</span><span>文件自动通过邮件发给其他人。</span></p>
<p>3.apk<span>文件上传服务器</span></p>
<p>等等</p></div><div id="MySignature"></div>
<div class="clear"></div>
<div id="blog_post_info_block">
<div id="blog_post_info">
</div>
<div class="clear"></div>
<div id="post_next_prev"></div>
</div>


	<div class = "postDesc">posted on <span id="post-date">2013-10-04 16:01</span> <a href='http://www.cnblogs.com/liuyue0802/'>青山隐隐，绿水迢迢</a> 阅读(<span id="post_view_count">...</span>) 评论(<span id="post_comment_count">...</span>)  <a href ="http://i.cnblogs.com/EditPosts.aspx?postid=3349931" rel="nofollow">编辑</a> <a href="#" onclick="AddToWz(3349931);return false;">收藏</a></div>
</div>
<script type="text/javascript">var allowComments=true,isLogined=false,cb_blogId=114940,cb_entryId=3349931,cb_blogApp=currentBlogApp,cb_blogUserGuid='0cd080dd-f185-e111-aa3f-842b2b196315',cb_entryCreatedDate='2013/10/4 16:01:00';loadViewCount(cb_entryId);</script>

<a name="!comments"></a><div id="blog-comments-placeholder"></div><script type="text/javascript">var commentManager = new blogCommentManager();commentManager.renderComments(0);</script>
<div id="comment_form" class="commentform">
<a name="commentform"></a>
<div id="divCommentShow"></div>
<div id="comment_nav"><span id="span_refresh_tips"></span><a href="javascript:void(0);" id="lnk_RefreshComments" onclick="return RefreshCommentList();">刷新评论</a><a href="#" onclick="return RefreshPage();">刷新页面</a><a href="#top">返回顶部</a></div>
<div id="comment_form_container"></div>
<div class="ad_text_commentbox" id="ad_text_under_commentbox"></div>
<div id="site_nav_under"><a href="http://www.cnblogs.com/" target="_blank" title="程序员的网上家园">博客园首页</a><a href="http://q.cnblogs.com/" target="_blank" title="程序员问答社区">博问</a><a href="http://news.cnblogs.com/" target="_blank" title="IT新闻">新闻</a><a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a><a href="http://job.cnblogs.com/" target="_blank">程序员招聘</a><a href="http://kb.cnblogs.com/" target="_blank">知识库</a></div>
<div id="ad_under_post_holder"></div>
<script type="text/javascript">
var enableGoogleAd = true;
var googletag = googletag || {};
googletag.cmd = googletag.cmd || [];
fixPostBodyFormat();
loadAdUnderPost();
</script>
<div id="HistoryToday" class="c_ad_block"></div>
<script type="text/javascript">
loadBlogSignature();
LoadPostInfoBlock(cb_blogId, cb_entryId, cb_blogApp, cb_blogUserGuid);
GetPrevNextPost(cb_entryId, cb_blogId, cb_entryCreatedDate);
GetHistoryToday(cb_blogId, cb_blogApp, cb_entryCreatedDate);
</script>
<script type="text/javascript">
    $.ajax({ url: 'http://counter.cnblogs.com/blog/post/' + cb_entryId, type: 'get', dataType: 'script', cache: true });
</script>
</div>

</div>
<div id="leftcontent">
	
		<DIV id="leftcontentcontainer">
			
<!--done-->
<div class="newsItem">
	<div id="blog-news"></div><script type="text/javascript">loadBlogNews();</script>
</div>

			<div id="blog-calendar" style="display:none"></div><script type="text/javascript">loadBlogDefaultCalendar();</script><br>
			<div id="blog-sidecolumn"></div><script type="text/javascript">loadBlogSideColumn();</script></DIV>
	
</div>

<!--done-->
<div class="footer">
	Powered by: <a href="http://www.cnblogs.com">博客园</a>	模板提供：<a href="http://blog.hjenglish.com">沪江博客</a>
	Copyright &copy;2014 青山隐隐，绿水迢迢
</div>



</body>
</html>
